﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using xplang.run;
using xplang.abstractions;
using xplang.errors;
using xplang.statements;
using xplang.contexts;
using xplang.fs;

namespace xplang.parse
{  

  public class CompilerForObject : CompilerForFiles
  {
    public CompilerForObject(SourceReader source, Context context, ClassRef type, Token name)
      : base(source, new Value(type))
    {
      this.declaringObject = (Value)declaring;
      context.registerObject(name, declaringObject);
    }

    Value declaringObject;

    public override void compileRequirements()
    {
      throw new NotImplementedException();
    }

    public override void compileDeclarations()
    {
      //compileObject(declaringObject);
      //checkEof(true);
    }

    private void compileObject(Value obj)
    {
      //checkOperator("{");
      //nextToken();
      //while (!isEof() && !isOperator("}"))
      //{
      //  Token propName = current;
      //  Variable prop = obj.type.getClassDecl().attributes.SingleOrDefault(a => a.name == propName.text);
      //  if (prop == null)
      //    new UnkownVariableError(propName);
      //  nextToken();
      //  checkOperator("=");
      //  nextToken();
      //  Value v = null;
      //  if (isOperator("["))
      //  {
      //    v = compileArray(obj, prop.type);
      //  }
      //  else if (isOperator("{"))
      //  {
      //    //v.type = prop.type;
      //    //ObjectDecl chield = new ObjectDecl(obj.global, propName.text, prop.type,
      //    //  prop.type.instanciate(obj._this));
      //    //compileObject(chield);
      //    //v.objRef = chield._this.objRef;
      //  }
      //  else if (current.type == TokenType.ttIntNumber)
      //  {
      //    //v = new Value();
      //    //v.type = xplang.rtl.RTL.intClass.getRef(null);
      //    //v.objRef = Convert.ToInt64(current.text);
      //  }
      //  else if (current.type == TokenType.ttDecNumber)
      //  {
      //    //v = new Value();
      //    //v.type = xplang.rtl.RTL.doubleClass.getRef(null);
      //    //v.objRef = Convert.ToDouble(current.text, FileSystem.formatProvider);
      //  }
      //  else if (current.type == TokenType.ttStringDouble)
      //  {
      //    //v = new Value();
      //    //v.type = xplang.rtl.RTL.stringClass.getRef(null);
      //    //v.objRef = current.text;
      //  }
      //  else
      //  {
      //    new ExpressionExpectedError(current);
      //    while (!isOperator(","))
      //      nextToken();
      //  }
      //  if (!isOperator("}"))
      //    readOperator(",");
      //}
      //readOperator("}");
    }

    private Value compileArray(Value obj, ClassRef classRef)
    {
      throw new NotImplementedException();
    }       

    public override void compileImplementations()
    {
      int n = implementationCodes.Count;
      for (int i = 0; i < n; i++)
        implementationCodes[i].compile();
    }
  }
}
